﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media.Imaging;

namespace Win32Wrapper.Win32.Helpers
{
    public class WindowHelper
    {
        private static List<Window> OpenWindows;

        private static bool EnumWindowsProc(IntPtr hWnd, int lParam)
        {
            String Title = Win32Helper.GetWindowText(hWnd);
            if (Title != "" & Win32.Win32Helper.IsWindowVisible(hWnd))
            {
                Window window = new Window();

                window.Title = Title;
                window.hWnd = hWnd;
                window.Process = System.Diagnostics.Process.GetProcessById(Win32Helper.GetWindowThreadProcessId(hWnd));
                window.WindowInfo = new WindowInfo(Win32Helper.GetWindowInfo(hWnd));

                try
                {
                    window.Image = IconExtractor.ExtractIconFromWindow(hWnd);
                }
                catch
                {
                    window.Image = new BitmapImage(new Uri(@"pack://application:,,,/window.ico"));
                }

                OpenWindows.Add(window);
            }
            return true;
        }

        public static List<Win32.Helpers.Window> GetDesktopWindows()
        {
            OpenWindows = new List<Window>();
            Win32Helper.EnumDelegate EnumFunction = new Win32.Win32Helper.EnumDelegate(EnumWindowsProc);

            // True wenn die Funktion Werte zurückgegeben hat.
            bool Success = Win32Helper.EnumDesktopWindows(IntPtr.Zero, EnumFunction, IntPtr.Zero);

            if (Success)
            {
                // Gibt die Liste mit allen geöffneten sichtbaren Fenster zurück.

                return OpenWindows;
            }
            else
            {
                // Ein Fehler ist aufgetreten.

                throw new Exception("EnumDesktopWindows failed");
            }
        }
    }
}
